package com.ztr.conversion.html2img;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.w3c.dom.Document;
import org.xhtmlrenderer.swing.Java2DRenderer;

import javax.imageio.ImageIO;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * <p>
 * html 转 图片 工具类 （core-renderer-R8）
 * </p>
 *
 * @description 可参考： https://flyingsaucerproject.github.io/flyingsaucer/r8/guide/users-guide-R8.html
 */
@Slf4j
public class Html2ImgUtil {

    /**
     * 将HTML内容转换为JPEG格式的图像字节。
     * 此方法通过解析HTML字节码，渲染为图像，然后将该图像转换为JPEG格式的字节数据。
     * 主要用于将HTML内容用于非Web环境下的显示，例如生成报告或邮件中的图像。
     *
     * @param htmlBytes 包含HTML内容的字节数组。
     * @return 包含JPEG图像数据的字节数组。
     * @throws Exception 如果解析HTML或渲染图像过程中发生错误，则抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static byte[] htmlBytes2JpgBytes(byte[] htmlBytes) {
        // 从HTML字节码创建输入流
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(htmlBytes);
        // 实例化文档构建器工厂，用于解析HTML
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        // 通过文档构建器工厂创建文档构建器
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        // 解析HTML输入流到文档对象
        Document document = documentBuilder.parse(byteArrayInputStream);
        // 使用解析的文档创建渲染器，指定图像的宽度和高度
        Java2DRenderer renderer = new Java2DRenderer(document, 800, 1000);
        // 通过渲染器获取渲染后的图像
        BufferedImage bufferedImage = renderer.getImage();
        // 创建输出流，用于存储JPEG图像数据
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        // 将图像写入输出流，指定格式为JPEG
        ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);
        // 返回JPEG图像的字节数据
        return byteArrayOutputStream.toByteArray();
    }


}
